package com.songhq.data.log.util;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;

public class GZIPUtils
{
  public static final String GZIP_ENCODE_UTF_8 = "UTF-8";

  public static byte[] compress(String str)
  {
    return compress(str, "UTF-8");
  }

  public static byte[] compress(String str, String encoding)
  {
    if ((str == null) || (str.length() == 0)) {
      return null;
    }
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    GZIPOutputStream gzip = null;
    try {
      gzip = new GZIPOutputStream(out);
      gzip.write(str.getBytes(encoding));
    }
    catch (IOException e) {
      e.printStackTrace();
    } finally {
      try {
        if (null != gzip)
          gzip.close();
      }
      catch (IOException e) {
        e.printStackTrace();
      }
    }
    return out.toByteArray();
  }

  public static byte[] uncompress(byte[] bytes)
  {
    if ((bytes == null) || (bytes.length == 0)) {
      return null;
    }
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    ByteArrayInputStream in = new ByteArrayInputStream(bytes);
    try {
      GZIPInputStream ungzip = new GZIPInputStream(in);
      byte[] buffer = new byte[256];
      int n;
      while ((n = ungzip.read(buffer)) >= 0)
        out.write(buffer, 0, n);
    }
    catch (IOException e) {
      e.printStackTrace();
    }

    return out.toByteArray();
  }

  public static String uncompressToString(byte[] bytes)
  {
    return uncompressToString(bytes, "UTF-8");
  }

  public static String uncompressToString(byte[] bytes, String encoding)
  {
    if ((bytes == null) || (bytes.length == 0)) {
      return null;
    }
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    ByteArrayInputStream in = new ByteArrayInputStream(bytes);
    try {
      GZIPInputStream ungzip = new GZIPInputStream(in);
      byte[] buffer = new byte[256];
      int n;
      while ((n = ungzip.read(buffer)) >= 0) {
        out.write(buffer, 0, n);
      }
      return out.toString(encoding);
    } catch (IOException e) {
      e.printStackTrace();
    }
    return null;
  }
}